package com.oyc.demo.listener;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelAnalysisException;
import com.oyc.demo.domain.Initdata;
import com.oyc.demo.service.InitdataService;
import com.oyc.demo.util.Constants;

public class InitdataListener extends AnalysisEventListener<Initdata> {
	
	/**
	  * 每1000条处理一次，然后清理list ，方便内存回收
	  */
	private static final int BATCH_COUNT = 1000;
	List<Initdata> list = new ArrayList<Initdata>();
	/**
	  * 假设这个是一个DAO，当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
	  */
	private InitdataService initdataService;
	private String provinceName;
	
	@Override
	public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
		// TODO Auto-generated method stub
		super.invokeHeadMap(headMap, context);
	    //表头行
		if(context.getCurrentRowNum()==1){
			if(headMap.size()!=Constants.CellNum){
				throw new ExcelAnalysisException("表头缺失");
			}
		}
	}
	
	 /**
	  * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
	  *
	  * @param demoDAO
	  */
	 public InitdataListener(InitdataService initdataService,String provinceName) {
	     this.initdataService = initdataService;
	     this.provinceName=provinceName;
	     //先删除临时表记录
	     initdataService.deleteById();
	 }
	 

	@Override
	public void invoke(Initdata data, AnalysisContext context) {
		//判断数据有效性
		if(data.getReelnumber()!=null&&data.getReelnumber().trim().length()>0&&data.getOrdernumber()!=null&&data.getOrdernumber().length()>0){
			//只载入包含省公司的行
			if(data.getProvincecompanyname().contains(provinceName)){
				list.add(data);
			}
		}
	     // 达到BATCH_COUNT了，需要去存储一次数据库，防止数据几万条数据在内存，容易OOM
	     if (list.size() >= BATCH_COUNT) {
	    	 saveData();
	     }
	}

	@Override
	public void doAfterAllAnalysed(AnalysisContext context) {
		// TODO Auto-generated method stub
		saveData();
	}
	
	/**
	  * 加上存储数据库
	  */
	 private void saveData() {
		 //如果list的长度大于0
		 if(list!=null&&list.size()>0){
			 initdataService.insertBatch(list);
			 list.clear();
		 }
	 }

}
